package BDD.modeles;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;


/**
 * @version 1.0.0
 * @author AZRIA Nouriel
 */
@Entity
public class Utilisateur implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    /* LES ATTRIBUTS */
    @NotNull
    @NotEmpty
    @Length(max=15)
    //@Pattern(regexp="[a-zA-Z]") // On accepte les noms de longueur 15 et contenant seulement des lettres 
    private String lastname;
    
    @NotNull
    @NotEmpty
    @Length(max=15)
    //@Pattern(regexp="[a-zA-Z]") // On accepte les noms de longueur 15 et contenant seulement des lettres 
    private String firstname;
    
    @NotNull
    @NotEmpty
    @Length(max=15)
    @Column(unique=true) 
    //@Pattern(regexp="[a-zA-Z0-9]") // On accepte les noms de longueur 15 et contenant seulement des lettres 
    private String identifiant;
    
    @NotNull
    @NotEmpty
    @Length(max=15)
    //@Pattern(regexp="[a-zA-Z0-9]") // On accepte les noms de longueur 15 et contenant seulement des lettres 
    private String mdp;
    
    @NotNull
    @NotEmpty
    @Length(max=20)
    //@Pattern(regexp="[a-zA-Z0-9]") // On accepte les noms de longueur 15 et contenant seulement des lettres 
    private String mail;

    @Temporal(javax.persistence.TemporalType.DATE)
    private Date lastNotificationViewedDate;
    
    @OneToMany(mappedBy = "utilisateur" )    // Un utilisateur peut posseder plusieurs albums
    private List<Album> albums;
    
    @OneToMany(mappedBy = "utilisateur")    // Un utilisateur peut posseder plusieurs commentaires
    private List<Commentaire> commentaires;
    
    @OneToMany(mappedBy = "utilisateurVisionnant")  // Un utilisateur peut posseder plusieurs albums partages
    private List<Utilisateur_AlbumPartage> utilisateur_AlbumPartages;
    
    @OneToMany(mappedBy = "utilisateur")    // Un utilisateur est lie a une plusieurs notifications
    private List<Notification> notifications;
    
    /* LES CONSTRUCTEURS */
    
    public Utilisateur(){
        this.notifications = new ArrayList<>();
        this.utilisateur_AlbumPartages = new ArrayList<>();
        this.commentaires = new ArrayList<>();
        this.albums = new ArrayList<>();
    }
    
    public Utilisateur(final String lastname, final String firstname, 
                       final String identifiant, final String mdp, final String mail, final Date lastNotificationViewedDate){
        this.notifications = new ArrayList<>();
        this.utilisateur_AlbumPartages = new ArrayList<>();
        this.commentaires = new ArrayList<>();
        this.albums = new ArrayList<>();
        
        this.lastname = lastname;
        this.firstname = firstname;
        this.identifiant = identifiant;
        this.mdp = mdp;
        this.mail = mail;
        this.lastNotificationViewedDate = lastNotificationViewedDate;
        
    }
    
    /* LES GETTERS/SETTERS */
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getIdentifiant() {
        return identifiant;
    }

    public void setIdentifiant(String identifiant) {
        this.identifiant = identifiant;
    }

    public String getMdp() {
        return mdp;
    }

    public void setMdp(String mdp) {
        this.mdp = mdp;
    }
    
    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

    public Date getLastNotificationViewedDate() {
        return lastNotificationViewedDate;
    }

    public void setLastNotificationViewedDate(Date lastNotificationViewedDate) {
        this.lastNotificationViewedDate = lastNotificationViewedDate;
    }
    
    public List<Album> getAlbums() {
        return albums;
    }

    public List<Commentaire> getCommentaires() {
        return commentaires;
    }

    public List<Utilisateur_AlbumPartage> getUtilisateur_AlbumPartages() {
        return utilisateur_AlbumPartages;
    }

    public List<Notification> getNotifications() {
        return notifications;
    }
   
    
    /* LES METHODES */
    
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (int) id;
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Utilisateur)) {
            return false;
        }
        Utilisateur other = (Utilisateur) object;
        if (this.id != other.id) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "BDD.modeles.Utilisateur[ id=" + id + " ]";
    }
    
    public void addAlbums(Album a) {  
        albums.add(a);  
    }  
  
    public void removeAlbums(Album a) {  
        albums.remove(a);  
    } 
    
    public void addCommentaires(Commentaire c) {  
        commentaires.add(c);  
    }  
  
    public void removeCommentaires(Commentaire c) {  
        commentaires.remove(c);  
    } 
    
    public void addUtilisateur_AlbumPartages(Utilisateur_AlbumPartage uap) {  
        utilisateur_AlbumPartages.add(uap);  
    }  
  
    public void removeUtilisateur_AlbumPartages(Utilisateur_AlbumPartage uap) {  
        utilisateur_AlbumPartages.remove(uap);  
    } 
    
    public void addNotifications(Notification n) {  
        notifications.add(n);  
    }  
  
    public void removeNotifications(Notification n) {  
        notifications.remove(n);  
    } 
    
}
